## CONJUNTOS

set A:= {('Cali', 'Buenaventura') ,('Cali','SantaMarta'), ('Cali','Barranquilla'),('Cali','Cartagena') ,('Cali' ,'Tebaida') ,('Cali' ,'Dorada'), ('Cali','Felisa') ,
('Armenia', 'Buenaventura') ,('Armenia','SantaMarta'), ('Armenia','Barranquilla'),('Armenia','Cartagena') ,('Armenia' ,'Tebaida') ,('Armenia' ,'Dorada'), ('Armenia','Felisa') ,
('Pereira', 'Buenaventura') ,('Pereira','SantaMarta'), ('Pereira','Barranquilla'),('Pereira','Cartagena') ,('Pereira' ,'Tebaida') ,('Pereira' ,'Dorada'), ('Pereira','Felisa') ,
('Medellin', 'Buenaventura') ,('Medellin','SantaMarta'), ('Medellin','Barranquilla'),('Medellin','Cartagena') ,('Medellin' ,'Tebaida') ,('Medellin' ,'Dorada'), ('Medellin','Felisa') ,
('Manizales', 'Buenaventura') ,('Manizales','SantaMarta'), ('Manizales','Barranquilla'),('Manizales','Cartagena') ,('Manizales' ,'Tebaida') ,('Manizales' ,'Dorada'), ('Manizales','Felisa') ,
('Buenaventura','Paisesbajos') ,('Buenaventura','Usa'),('Buenaventura','Espana'),('Cartagena','Espana'),('Cartagena','Paisesbajos'),('Cartagena','Usa'),('Barranquilla','Paisesbajos'),('Barranquilla','Usa'),('Barranquilla','Espana'),('SantaMarta','Paisesbajos'),('SantaMarta','Usa'),('SantaMarta','Espana'),
('Tebaida','Buenaventura'),('Felisa', 'Buenaventura'), ('Dorada', 'SantaMarta') ,('SantaMarta','Barranquilla'), ('SantaMarta', 'Cartagena')};


set B;
set C;
set D;
set I;
set N;
set T;
set K;

set Escenarios; ## Conjunto de escenarios indexados por s


##VARIABLES
var Cescenarios{Escenarios}>=0; #costo por escenario 

var M {A,s in Escenarios}>=0; #[contenedor] de enviar de i a j
var Y {N} binary; #1. Se decide utilizar nodo intermedio n
var Z{T,s in Escenarios} >=0 integer; #N° de vehículos alquilados en el lugar i
var COS >=0 ; #variable de costos logísticos
var F{D, s in Escenarios} >=0; #variable de demanda insatisfecha 

##PARÁMETROS

param Q {i in B} >=0; #cantidad producida en ciudad [contenedor]
param Dem {j in D} >=0; #demanda de los clientes en mercados internacionales [contenedor]
param CAPMAX >=0; #capacidad de tren carga completa [contenedor]
param CAPMIN >=0; #Capacidad mínima de tren de carga completa [contenedor]
param CAPV >=0; #Capacidad del vehículo [contenedor]
param GRANM >=0; #Número muy grande
param CostoV >=0; #Costo de alquiler del vehículo [$/contenedor]
param Flete {(i,j) in A} >=0; #Fletes de cada arco [$/contenedor]
param Costofaltante {j in D,s in Escenarios} >=0; #costo de faltante [$/contenedor]
param PROB {s in Escenarios} >=0; #probabilidad de cada escenario

#Factor de conversión de Ton a número de contenedores


##FUNCIÓN MULTIOBJETIVO MAXIMIZAR NIVEL DE SERVICIO Y MINIMIZAR COSTOS LOGÍSTICOS

minimize costo_logistico:

sum {s in Escenarios} (PROB[s]*Cescenarios[s]);

#sum {s in Escenarios} (PROB[s]* (sum{ j in D}(Costofaltante[j,s] *F[j,s]) + sum{(i,j) in A} (Flete[i,j]* M[i,j,s]) + sum {i in T} (CostoV*Z[i,s])));

##RESTRICCIONES
subject to R1 {j in B, s in Escenarios}: Q[j] >= sum{ (j,i) in A} M[j,i,s]; #Balance, lugares que produce
subject to R2 {j in K, s in Escenarios}: sum{(i,j) in A} M[i,j,s] = sum{ (j,i) in A} M[j,i,s]; #Balance sin tener en cuenta los lugares de orígen, todos los i que no estén en B (I SLACH AL REVÉS B)
subject to R3 {j in D,s in Escenarios}: sum{(i,j) in A} M[i,j,s] = Dem[j] -F[j,s]; #Se cumple la demanda en la mayor medida posible lo que se envía es igual a la demanda - el faltante (es lo que se puede entregar)
subject to R4 {j in N, s in Escenarios}: sum{(j,i) in A} M[j,i,s] <= CAPMAX*Y[j]; #Capacidad máxima que tienen los nodos férreos para enviar producto si se decide utilizarlos
subject to R5 {j in N, s in Escenarios}: sum{(j,i) in A} M[j,i,s] >= CAPMIN*Y[j]; #Cant Mínima que se ppuede enviar por el nodo férreo si se decide usar
subject to R6 {i in T, s in Escenarios}: sum{(i,j) in A} M[i,j,s] <= CAPV*Z[i,s]; #Cuántos vehículos se necesita para realizar cada envío
subject to R8 : sum{i in N}Y[i]=0; #Esta restricción es para validar el modelo si funciona intermodal o no
subject to R9 {s in Escenarios}:  (PROB[s]* (sum{ j in D}(Costofaltante[j,s] *F[j,s]) + sum{(i,j) in A} (Flete[i,j]* M[i,j,s]) + sum {i in T} (CostoV*Z[i,s]))) =Cescenarios[s];


#Se asume que se puede dejar demanda insatisfecha
#

